package com.wkk.yuli.aop;

import com.wkk.yuli.annotation.ClearPolicy;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.context.annotation.Configuration;

/**
 * @author : WangKeKe
 * @date : 2020/9/25 13:41
 * Description : AOP 实现清除策略FIFO
 */

@Aspect
@Slf4j
@Configuration
public class ClearPolicyAspect {


    @Pointcut("@annotation(com.wkk.yuli.annotation.ClearPolicy)"+ "||@within(com.wkk.yuli.annotation.ClearPolicy)")
    public void clearPolicyPointcut() {
    }

    @Around("clearPolicyPointcut()")
    public Object interceptor(ProceedingJoinPoint joinPoint) throws Throwable {
        ClearPolicy annotation = joinPoint.getTarget().getClass().getAnnotation(ClearPolicy.class);
        Object result = joinPoint.proceed();
        if (annotation.open()){
            clearPolicyHandle(annotation.policy());
        }
        // 获取注解中的值
        return result;
    }

    private void clearPolicyHandle(String policy) {
        switch (policy) {
            case "FIFO":
                log.info(policy);
                // 先进先出，按对象进入缓存的顺序来移除它们；常见使用队列Queue来实现；
                break;
            case "LRU":
                // 最近最少使用，移除最长时间不被使用的对象；常见的使用LinkedHashMap来实现，也是很多本地缓存默认使用的策略；
                break;
            case "LFU":
                // 最近最少使用的意思，和LRU有点像；区别点在LRU的淘汰规则是基于访问时间，而LFU是基于访问次数的
                break;
            case "SOFT":
                // 基于垃圾回收器状态和软引用规则移除对象；常见使用SoftReference来实现；
                break;
            case "WEAK":
                // 弱引用更积极地基于垃圾收集器状态和弱引用规则移除对象；常见使用WeakReference来实现；
                break;
            default: // 默认FIFO
                break;
        }
    }


}
